package co.edu.ucatolica.sislab.persistence.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import co.edu.ucatolica.sislab.persistence.DatabaseException;
import co.edu.ucatolica.sislab.persistence.DatabasePersistorHelper;
import co.edu.ucatolica.sislab.persistence.dto.SancionDTO;
import co.edu.ucatolica.sislab.persistence.dto.UserDTO;
import co.edu.ucatolica.sislab.persistence.utils.DatabaseOperations;
import co.edu.ucatolica.sislab.persistence.utils.PersistenceUtils;
import co.edu.ucatolica.sislab.persistence.utils.SQLSISLABDBConstants;
import co.edu.ucatolica.sislab.users.domain.UserDataBean;
import co.edu.ucatolica.sislab.utils.DatabaseTables;

public class UserPersitorHelper {
	/** Permite registrar mensajes del sistema.*/
	private static Logger logger = LoggerFactory.getLogger(UserPersitorHelper.class);
	
	public static Long autenticateUser(long transactionNumber, UserDTO userDTO) throws DatabaseException {
		Connection dbConnection = null;
		PreparedStatement ps = null;
		try {
			dbConnection = DatabasePersistorHelper.getConexion(transactionNumber);
			String sql = DatabasePersistorHelper.getSql(SQLSISLABDBConstants.SQL_SELECT_AUTENTICATE_USER);
			
			if ((dbConnection != null) && (sql != null)) {
				ps = dbConnection.prepareStatement(sql);
				ps.setString(1, userDTO.getLogin());
				ps.setString(2, userDTO.getPassword());
				ResultSet rs = ps.executeQuery();
				if(rs.next()){
					return rs.getLong(1);
				}
			}
		} catch (SQLException e) {
			logger.error("No fue posible ejecutar la consulta de autenticacion de usuario: " + userDTO.getLogin() + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.USUARIOS, DatabaseOperations.SELECT, e.toString());
		} catch (DatabaseException e) {
			logger.error("No fue posible ejecutar la consulta de autenticacion de usuario: " + userDTO.getLogin() + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.USUARIOS, DatabaseOperations.SELECT, e.toString());
		} finally {
			PersistenceUtils.closeConnectionIssues(ps);
		}
		return null;
	}

	public static UserDataBean getUserDataBeanByCode(long transactionNumber, UserDTO userDTO) throws DatabaseException {
		Connection dbConnection = null;
		PreparedStatement ps = null;
		try {
			dbConnection = DatabasePersistorHelper.getConexion(transactionNumber);
			String sql = DatabasePersistorHelper.getSql(SQLSISLABDBConstants.SQL_SELECT_USER_DATA);
			
			if ((dbConnection != null) && (sql != null)) {
				ps = dbConnection.prepareStatement(sql);
				ps.setLong(1, userDTO.getCodigo());
				ResultSet rs = ps.executeQuery();
				if(rs.next()){
					UserDataBean userDataBean = new UserDataBean();
					userDataBean.setCodigo(rs.getLong("codigo"));
					userDataBean.setNombre(rs.getString("nombre"));
					return userDataBean;
				}
			}
		} catch (SQLException e) {
			logger.error("No fue posible ejecutar la consulta de autenticacion de usuario: " + userDTO.getLogin() + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.USUARIOS, DatabaseOperations.SELECT, e.toString());
		} catch (DatabaseException e) {
			logger.error("No fue posible ejecutar la consulta de autenticacion de usuario: " + userDTO.getLogin() + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.USUARIOS, DatabaseOperations.SELECT, e.toString());
		} finally {
			PersistenceUtils.closeConnectionIssues(ps);
		}
		return null;
	}

	public static Long createUser(long transactionNumber, UserDTO userDTO) throws DatabaseException {
		Connection dbConnection = null;
		PreparedStatement ps = null;
		try {
			dbConnection = DatabasePersistorHelper.getConexion(transactionNumber);
			String sql = DatabasePersistorHelper.getSql(SQLSISLABDBConstants.SQL_CREATE_USER_DATA);
			
			if ((dbConnection != null) && (sql != null)) {
				ps = dbConnection.prepareStatement(sql);
				ps.setString(1, userDTO.getNombre());
				ps.setLong(2, userDTO.getCodigo());
				ps.setLong(3, userDTO.getTelefono());
				ps.setLong(4, userDTO.getIdentificacion());
				ps.setLong(5, userDTO.getTipoId());
				ps.setLong(6, userDTO.getEstado());
				ps.setString(7, userDTO.getLogin());
				ps.setString(8, userDTO.getPassword());				
				ps.execute();
				
				return DatabasePersistorHelper.getIdentity(dbConnection);
			}
		} catch (SQLException e) {
			logger.error("No fue posible ejecutar la consulta de autenticacion de usuario: " + userDTO.getLogin() + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.USUARIOS, DatabaseOperations.INSERT, e.toString());
		} catch (DatabaseException e) {
			logger.error("No fue posible ejecutar la consulta de autenticacion de usuario: " + userDTO.getLogin() + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.USUARIOS, DatabaseOperations.INSERT, e.toString());
		} finally {
			PersistenceUtils.closeConnectionIssues(ps);
		}
		return null;
	}

	
}
